/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;

import controller.*;
import controller.algorithme.AlgoEconomieEnergie;
import controller.algorithme.AlgoModeAutomatique;
import controller.algorithme.AlgoTrajetLePlusCourt;
import controller.algorithme.Algorithme;
import ihm.IHMSimulation;
import java.util.HashMap;
import javax.swing.UIManager;
import model.*;

/**
 *
 * @author benoit
 */
public class Main {
    public static void main(String[] args) {
//		SwingUtilities.invokeLater(new Runnable() {
//            public void run() {
//                new IHMSimulation().setVisible(true);
//            }
//        });
        Batiment batiment = null;
        Simulation simu = null;
        Date date = new Date();
        
        SimulationControleur simuControleur = null;
        AscenseurControleur ascenseurControleur = null;
        EtageControleur etageControleur = null;
        DateControleur dateControleur = new DateControleur(date);
        AlgorithmeControleur algorithmeControleur = null;
        BatimentControleur batimentControleur = null;
        
        HashMap<Integer,Etage> etages = new HashMap<Integer,Etage>();
        HashMap<Integer,Ascenseur> ascenseurs = new HashMap<Integer,Ascenseur>();
        HashMap<Integer,Algorithme> algos = new HashMap<Integer,Algorithme>();

        etages.put(-4,new Etage(-4));
        etages.put(-3,new Etage(-3));
        etages.put(-2,new Etage(-2));
        etages.put(-1,new Etage(-1));
        etages.put(0,new Etage(0));
        etages.put(1,new Etage(1));
        etages.put(2,new Etage(2));
        etages.put(3,new Etage(3));
        etages.put(4,new Etage(4));
        etages.put(5,new Etage(5));
        etages.put(6,new Etage(6));
        etages.put(7,new Etage(7));
        etages.put(8,new Etage(8));
        etages.put(9,new Etage(9));
        etages.put(10,new Etage(10));
        etages.put(11,new Etage(11));
        etages.put(12,new Etage(12));
        etages.put(13,new Etage(13));
        etages.put(14,new Etage(14));
        etages.put(15,new Etage(15));
        etages.put(16,new Etage(16));
        etages.put(17,new Etage(17));
        etages.put(18,new Etage(18));
        etages.put(19,new Etage(19));
        etages.put(20,new Etage(20));
        etages.put(21,new Etage(21));
        etages.put(22,new Etage(22));
        etages.put(23,new Etage(23));
        etages.put(24,new Etage(24));
        etages.put(25,new Etage(25));
        etages.put(26,new Etage(26));
        etages.put(27,new Etage(27));
        etages.put(28,new Etage(28));
        etages.put(29,new Etage(29));
        etages.put(30,new Etage(30));
        etages.put(31,new Etage(31));
        etages.put(32,new Etage(32));
        etages.put(33,new Etage(33));
        etages.put(34,new Etage(34));
        etages.put(35,new Etage(35));
        etages.put(36,new Etage(36));
        etages.put(37,new Etage(37));
        etages.put(38,new Etage(38));
        etages.put(39,new Etage(39));
        etages.put(40,new Etage(40));

        ascenseurs.put(1, new Ascenseur(1, etages.get(0), etages.get(0)));
        ascenseurs.put(2, new Ascenseur(2, etages.get(10), etages.get(10)));
        ascenseurs.put(3, new Ascenseur(3, etages.get(15), etages.get(15)));
        ascenseurs.put(4, new Ascenseur(4, etages.get(25), etages.get(25)));
        ascenseurs.put(5, new Ascenseur(5, etages.get(30), etages.get(30)));
        ascenseurs.put(6, new Ascenseur(6, etages.get(35), etages.get(35)));

        batiment = new Batiment("Hotel Des Sources", etages, ascenseurs);
        simu = new Simulation(batiment,date);
        
        batimentControleur = new BatimentControleur(batiment);
        etageControleur = new EtageControleur(etages);
        ascenseurControleur = new AscenseurControleur(ascenseurs,etageControleur,dateControleur);
        
        /* On remplit le hashmap ici car on a besoin de ascenseurControleur pour instancier les algos */
        algos.put(Algorithme.ECONOMIE_ENERGIE, new AlgoEconomieEnergie(ascenseurControleur));
        algos.put(Algorithme.LE_PLUS_COURT, new AlgoTrajetLePlusCourt());
        algos.put(Algorithme.MODE_AUTOMATIQUE, new AlgoModeAutomatique(dateControleur,ascenseurControleur));
        
        algorithmeControleur = new AlgorithmeControleur(algos,batimentControleur);
        simuControleur = new SimulationControleur(simu,algorithmeControleur);
        
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }catch (Exception ex){
            System.out.println("Unable to load Windows look and feel");
        }
        
        new IHMSimulation(simuControleur,dateControleur,ascenseurControleur,algorithmeControleur,etageControleur).setVisible(true);
    }
}
